package com.nave.segundaguerra.servidorecliente.servidor;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import android.content.Context;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.Log;

import com.nave.segundaguerra.game.Angulator;
import com.nave.segundaguerra.game.Player;
import com.nave.segundaguerra.servidorecliente.util.BitmapStorage;
import com.nave.segundaguerra.servidorecliente.util.Connection;
import com.nave.segundaguerra.servidorecliente.util.DialogHelper;
import com.nave.segundaguerra.servidorecliente.util.ImageLibrary;
import com.nave.segundaguerra.servidorecliente.util.Protocolo;
import com.nave.segundaguerra.servidorecliente.util.RectLibrary;

public class TiroServer 
{	// Propriedades do tiro
	private PointF posicaoTiro;
	private PointF velocidade;
	private PlayerServer meuDono;
	private Rect rectBala;
	Angulator angulo;
	// Comunicacao com Servidor
	private List<Connection> connectionList;
	
	public TiroServer(PlayerServer player, PointF touch)
	{
		this.meuDono = player;
		this.posicaoTiro = player.getPosition();
		angulo = new Angulator(player.getPosition(), touch);
		//this.velocidade = new Point(touch.x/15, touch.y/15);
		this.velocidade = angulo.getSpeed();
		
		int right = ImageLibrary.getInstance().getImageSize("Tiro").x;
		int bottom = ImageLibrary.getInstance().getImageSize("Tiro").y;
		rectBala = new Rect((int)this.posicaoTiro.x, (int)this.posicaoTiro.y, right, bottom);
		
	}
	
	public void update()
	{
		posicaoTiro.x += this.velocidade.x; 
		posicaoTiro.y += this.velocidade.y;
		//SendForAll(this.toStringCSV());
	}
	
	public boolean offsetScreen()
	{
		if(posicaoTiro.x > BitmapStorage.getInstance().getCenario().getWidth() || posicaoTiro.y > BitmapStorage.getInstance().getCenario().getHeight() || posicaoTiro.x < 0 || posicaoTiro.y < 0)
			return true;
		
		return false;
	}
	
	public boolean checarColisao(ConcurrentHashMap<String, PlayerServer> jogadores)
	{

		Iterator iterator = jogadores.keySet().iterator();
		
		while (iterator.hasNext()) 
		{
			String key = (String) iterator.next();
			PlayerServer jogador = jogadores.get(key);
			
			if(this.getOwner().getTime() != jogador.getTime())
			{
				if(rectBala.intersect(jogador.getRect()))
				{
					jogador.respawn();
					Log.i("COLISAO TIRO", "TOMOU   " + posicaoTiro);
					return true;
				}
			}
		}
		return false;

	}
	private boolean Intersect(PlayerServer player)
	{
		if(this.rectBala.intersect(player.getRect())){
			return true;
		}
		return false;
	}
	
	public PointF getPosition()
	{
		return this.posicaoTiro;
	}
	public Rect getRect() 
	{
		return this.rectBala;
	}
	public PlayerServer getOwner()
	{
		return this.meuDono;
	}
	
	public String toStringCSV() {
		return Protocolo.PROTOCOL_SHOOT + "," + this.posicaoTiro.x + "," + this.posicaoTiro.y;
	}
	public void setLisConnection(List<Connection> list){
		this.connectionList = list;
	}
	public void SendForAll(String msg)
	{
		if(connectionList != null)
		for (Connection connection : connectionList) {
			connection.Send(msg);
		}
	}
}
